#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,q;
char s[N];
struct node{
    int sum,mn,mx,res;
}t[N*4];
void pushup(int p){
    int ls=p<<1,rs=p<<1|1;
    t[p].sum=t[ls].sum+t[rs].sum;
    t[p].mn=min(t[ls].mn,t[rs].mn+t[ls].sum);
    t[p].mx=max(t[ls].mx,t[rs].mx+t[ls].sum);
    t[p].res=max(max(t[ls].res,t[rs].res),t[rs].mx+t[ls].sum-t[ls].mn);
}
void build(int p,int l,int r){
    if(l==r){
        if(s[l]=='1')t[p].sum=1;
        else t[p].sum=-1;
        t[p].mn=min(0,t[p].sum);
        t[p].mx=max(0,t[p].sum);
        t[p].res=max(0,t[p].sum);
        return;
    }
    int mid=l+r>>1,ls=p<<1,rs=p<<1|1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(p);
}
int qsum,qmn,qres;
void query(int p,int l,int r,int x,int y){
    if(x<=l&&r<=y){
        qres=max(max(qres,t[p].res),t[p].mx+qsum-qmn);
        qmn=min(qmn,t[p].mn+qsum);
        qsum+=t[p].sum;
        return;
    }
    int mid=l+r>>1,ls=p<<1,rs=p<<1|1;
    if(x<=mid)query(ls,l,mid,x,y);
    if(mid<y)query(rs,mid+1,r,x,y);
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    freopen("good.in","r",stdin);
    freopen("good.out","w",stdout);
    cin>>n>>q;
    cin>>s+1;
    build(1,1,n);
    int ans=0;
    while(q--){
        int l,r;
        cin>>l>>r;
        qsum=0,qmn=0,qres=0;
        query(1,1,n,l,r);
        if(qsum<r-l+1)qres=max(qres,1);
        ans^=qres-qsum;
    }
    cout<<ans;
    return 0;
}
